COM模块在AUTOSAR架构中 位于RTE与PDUR之间 ,如下图所示:
其主要功能包括:实现Signal在I-PDU中的封装及解析,为RTE层提供基于Signal的收发接口,实现基于Signal的网关功能,支持PDU不同发送模式以及Signal滤波、Update bit、Pdu Counter等功能。应用层无需关注信号传输总线,信号(由DBC(CAN总线)或LDF(LIN总线)文件定义)经RTE传输至Com层,打包成I-PDU后发至PDUR,应用层只需依据信号实际意义开发,其余工作交底层软件处理。
I-PDU Group使能控制功能实现:
ComIPdu可通过ComIPduGroupRef参数与ComIPduGroup配置实现分组。不属于任何ComIPduGroup的ComIPdu,通信使能状态初始化后始终为Enable,RxComIPdu接收超时使能状态初始化后始终为Disable,两者均不可动态更改。
IpduGroupVector以每个bit位代表一个ComIPduGroup ,借助Com_IpduGroupControl和Com_ReceptionDMControl可实现对ComIPduGroup的通信使能与接收超时使能控制,进而间接控制每个ComIPdu。
Com还提供Com_ClearIpduGroupVector和Com_SetIpduGroup两个接口,用于将每个ComIPduGroup在IpduGroupVector中对应bit位置0(Disable)或置1(Enable)。
信号的封装和解析是Com模块的核心功能,根据各个信号的配置信息将发送Signal封装到关联的TxIPdu数据中,从Rx IPdu数据中解析接收Signal。Com模块为RTE/应用层提供了完整的基于Signal/SignalGroup的收发接口。
Signal封装解析功能实现
信号的封装与解析依赖ComBitPosition、ComBitSize、ComSignalEndianness、ComSignalType及ComSignalLength等配置参数。Com模块依据这些参数,将发送信号值封装进对应IPdu报文,从接收的IPdu报文中解析出信号值。
上层调用不同接口实现信号相关操作:
发送操作:使用Com_SendSignal请求非动态长度类型信号发送;Com_SendDynSignal用于动态长度类型(UINT8_DYN)信号发送;Com_SendSignalGroup请求SingGroup发送;Com_InvalidateSignal与Com_InvalidateSignalGroup分别用于请求Signal与SignalGroup发送无效值;Com_SendSignalGroupArray用于请求上层字节对齐且已完成封装的SignalGroup发送。
• 接收操作:通过Com_ReceiveSignal获取非动态长度类型接收信号值;Com_ReceiveDynSignal获取动态长度类型接收信号值;Com_ReceiveSignalGroup请求接SignalGroup;Com_ReceiveSignalGroupArray获取字节对齐SignalGroup的数据值。
Com模块实现IPdu收发,按数据流分为IF和TP两种方式:IF方式适用于传输总线定义下“数据长度较小”的IPdu,TP方式则用于“数据长度较大”的IPdu,“数据长度”依传输总线而定,如CAN总线8字节、CANFD 64字节、ETH超1000字节。
IPdu收发功能实现:
ComIPdu 的收发方式由其配置参数 ComIPduType 决定,分为 IF 和 TP 两种:
IF 方式:
发送流程:PduR_ComTransmit至收到Com_TxConfirmation。
接收流程:PduR_RxIndication至Com_RxIndication。
TP 方式:
发送流程:PduR_ComTransmit后经 N 次 Com_CopyTxData至 Com_TpTxConfirmation。
接收流程:Com_StartOfReception后经 N 次 Com_CopyRxData至 Com_TpRxIndication。
TxIPdu 的发送模式由 ComTxModeMode 配置选择,不同模式配置要求如下:
PERIODIC 模式:需配置发送偏移 ComTxModeTimeOffset 和发送周期 ComTxModeTimePeriod 。
DIRECT模式:需配置发送重复次数 ComTxModeNumberOfRepetitions(要求重复发送次数>0)和重复发送报文周期 ComTxModeRepetitionPeriod 。
MIXED 模式:需配置上述两种模式的所有参数。
NONE 模式:无需配置上述任何参数。
Com模块实现基于Signal/SignalGroup的超时监测功能。对于发送实现超时通知机制,对于接收实现超时通知和超时替换两种机制。
超时监测功能实现:
发送超时监测:监测从 Signal/SignalGroup 请求发送到其所在 IPdu 发送成功的时长,IPdu 超时时间阈值为请求发送的 Signal/SignalGroup 配置的超时时间最小值。若发送超时,调用各 Signal/SignalGroup 配置的超时通知函数 ComTimeoutNotification 告知上层模块。
接收超时监测:监测两次成功接收 Signal/SignalGroup 信号值的间隔时段,超时时间阈值依据 Signal/SignalGroup 各自配置参数确定。一旦超时,一方面调用超时通知函数 ComTimeoutNotification 通知上层模块;另一方面,可通过配置参数 ComRxDataTimeoutAction 选择“REPLACE”,将接收信号值替换为初始值。
Com模块实现基于信号的信号值进行过滤的机制,虽然对于收发信号的过滤算法一样,但过滤的目的完全不同。
对于接收Signal/SignalGroup,过滤算法未通过时,将舍弃当前接收到的Signal/SignalGroup。
对于发送Signal/GroupSignal,过滤算法的结果只决定该发送IPdu选择ComTxModeTrue或者ComTxModeFalse进行报文发送,不会舍弃信号本身。
信号滤波功能实现:
通过配置Signal/GroupSignal的ComFilter来选择其过滤算法及算法所需的各种参数,过滤算法的结果分TRUE和FALSE两种。
对于接收Signal/SignalGroup只有当通过过滤算法,才将接收信号值更新到接收Buffer中供上层模块获取,未通过过滤算法则舍弃当前接收信号值,不更新接收Buffer中的信号值。对于SignalGroup,只要其包含的任一GroupSignal未通过过滤算法,则整个SignalGroup信号值都将舍弃。
对于发送Signal/GroupSignal,若过滤算法通过,其TMC置为TRUE,未通过置为FALSE。只要该IPdu包含的所有Signal/GroupSignal中存在任一TMC为TRUE,则IPdu的TMS为TRUE,否则为FALSE。IPdu根据其TMS选择通过ComTxModeTrue或者ComTxModeFalse进行报文发送,发送Pdu中ComTxIPdu至少需要配置ComTxModeTrue。发送信号的滤波只有在ComTxModeTrue和ComTxModeFalse都配置时才有意义。
Com模块实现基于Signal/SignalGroup的UpdateBit机制来识别信号是否更新(信号更新,但信号值不一定变化)。
信号Update功能实现:
Signal/SignalGroup通过配置参数ComUpdateBitPosition来决定是否支持Update机制,Update Bit本身占用IPdu中一个Bit位,该Bit位为1表示对应Signal/SignalGroup有更新,为0表示对应Signal/SignalGroup没有更新。
对于发送信号,当请求Signal/SignalGroup发送时,Com模块将其Update位置1,表示该信号有更新,通过ComTxIPdu的配置参数ComTxIPduClearUpdateBit决定什么时候清除(置0)该发送IPdu中所有的Update位。
对于接收信号,只有当检测到Signal/SignalGroup的Update位为1,才执行进一步接收操作,否则舍弃该信号。
在Com中,信号网关功能仅针对Signal和GroupSignal ,不过R19_11标准不再支持基于SignalGroup的网关。信号网关支持1 : 1和1 : N的映射关系。
对于GwSource信号与GwDestination信号,二者信号类型及长度必须相同,且GwSource信号与RxIPdu关联,GwDestination信号与Tx IPdu关联。
Tip:TP Pdu中的Signal/Group Signal不支持信号网关。
信号网关功能实现:
信号网关路由依靠配置ComGwMapping来达成,通过主函数Com_MainFunctionRouteSignals周期性处理。
Tip:一旦配置ComGwMapping,ComGwSource和ComGwDestination必须填充具体内容。
GwSource信号有两种配置方式:
ComGwSourceDescription配置方式:适用于网关Source信号在ComSignal/ComGroupSignal中未配置,且上层模块不获取该信号值的情况。此时要像配置Signal参数那样去配置ComGwSourceDescription。
ComGwSignal配置方式:用于网关Source信号在ComSignal/ComGroupSignal中有配置,且上层模块既希望信号被转发,又想获取该信号值的场景。这种方式只需通过ComGwSignal→ComGwSignalRef关联到ComSignal/ComGroupSignal即可。
GwDestination信号同样有两种配置方式:
ComGwDestinationDescription配置方式:若网关Description信号在ComSignal/ComGroupSignal中未配置,且上层模块不请求该信号发送,就采用此方式,类似配置Signal参数来配置ComGwDestinationDescription。
ComGwSignal配置方式:当网关Description信号在ComSignal/ComGroupSignal中有配置,且上层模块既希望信号通过网关转发,又想请求该信号发送时,通过ComGwSignal→ComGwSignalRef关联到ComSignal/ComGroupSignal即可。
Com模块实现基于IPdu的Rolling Counter功能,让IPdu接收端能够识别出IPdu的序列是否正确。
IPdu Rolling Counter功能实现:
在Com模块中,ComIPduCounter用于管理TxIPdu和RxIPdu的计数:
TxIPdu计数:对于配置了ComIPduCounter的TxIPdu,每次发送时Counter值自增1,达到最大值后归零(初始值为0)。Counter值在IPdu中的位置由ComIPduCounterStartPosition和ComIPduCounterSize确定,且不能跨字节。
RxIPdu计数匹配:对于配置了ComIPduCounter的RxIPdu启动后,首帧IPdu无论Counter值为何都匹配成功。后续期望Counter值基于上一次接收IPdu(即便上次不匹配)的Counter值+1 。
COM 模块在实现信号或信号簇的发送功能时,传输模式起着关键作用。它决定了 PDU 报文的具体传输方式,例如是按固定周期发送,还是在特定条件触发时发送等,AUTOSAR一共定义了4种信号传输模式:
在AUTOSAR COM规范中允许为每个I-PDU静态配置两种不同的传输模式,ComTxModeTrue和ComTxModeFalse。可以通过传输模式的切换,来选择I-PDU中的其中一种传输模式进行传输(在后边TMC和TMS的介绍中会提到)。
相信大家在配置COM模块的时候会遇到发送模式的配置,那么这些发送模式是如何触发的呢,依赖的就是TMC。
发送端信号的TMC(发送模式条件)的计算与接收端的信号过滤机制相同,但是,在发送端信号过滤并不会丢弃任何的信号,而只是用于计算信号TMC的值。
COM提供了如下八种信号过滤机制:
发送端的TMS,一个I-PDU的TMS的值是根据其所有下属的信号的TMC结果决定的,若一个I-PDU下属的信号中至少有一个信号的TMC计算为True,那么这个I-PDU的TMS为True,只有该I-PDU下属的所有的信号的TMC都计算为False时,该I-PDU的TMS才为False。
Tip:举个例子,简要说明传输模式的切换。
用例中进行周期传输和直接/N次传输之间的切换(N=3)。
根据I-PDU的传输配置,当TMS(transmission mode selector)判断为真时,设置传输模式为周期传输,反之为直接/N次传输。上层给定值V=a(TMS判断为真),进行周期传输;当值V更新为b时(TMS判断为假),进行直接/N次传输模式,传输三次。随着V值的更新该I-PDU的传输模式在这两种传输模式之间切换。
总结来看,可以为每个I-PDU配置两种发送模式,在程序运行过程中,某I-PDU的发送模式是由TMS来决定,若一个I-PDU的TMS根据上述的算法计算为True,那么该I-PDU将以配置的True状态下的发送模式进行发送。当一个I-PDU下属的某个信号的过滤算法配置为ALWAYS,那么这个I-PDU将一直以用户配置的TMS为True状态下发送模式进行发送。
AUTOSAR COM的信号值包括三种:
初始值:AUTOSAR COM模块使用配置参数ComSignalInitValue的低N位初始化发送方和接收方的每个N位的信号类型, 配置的ComSignalInitValues也用于I-PDU的初始化信号。一个信号的ComSignalInitValue可以与ComSignalDataInvalidValue值相同。初始化阶段会清空所有update-bits值。默认情况下,所有I-PDU组应在停止状态,不得由Com_Init()调用启动。
数据无效值:通过调用Com_InvalidateSignal, AUTOSAR COM模块将在内部执行带有配置ComSignalDataInvalidValue的Com_SendSignal。ComTransferProperty和传输模式决定了ComSignalDataInvalidValue在总线上的传输。内部执行的带有数据无效值的Com_SendSignal,会决定被用作过滤器的数据无效值和TMS当前值。VFB仅为复杂数据类型定义一个属性。因此,一个失效的复杂数据类型到一个失效的信号簇的最佳映射是使一个信号簇的所有信号失效。因此,RTE还可以通过调用Com_InvalidateSignalGroup来请求使整个信号簇无效。
正常值:初始化阶段之后的有效值,包括COM部分收发的信号值。
AUTOSAR COM在Com_Init()执行时,将初始化所有I-PDU内容,首先用默认值(ComTxIPduUnusedAreasDefault)来更新PDU中未填充信号的字节,然后根据所包含信号的初始值(ComSignalInitValue)以及更新位来初始化剩余字节。
为支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供信号组解决方案,能一致地收发信号组,支持静态配置,可给每个信号组配置符号名。
它借助Shadowbuffer缓冲区机制实现信号组一致性,RTE访问Shadowbuffer里的组信号,若需与I - PDU同步,RTE可通过Com_SendSignalGroup或Com_ReceiveSignalGroup显式触发,且同步以原子方式执行。此外,还可启用信号组数组API(Com_SendSignalGroupArray和com_receivesignalgrouparray )作为实现信号组一致性的替代方法。
在初始化方面,调用Com_Init可初始化发送端信号组的shadow缓冲区,结构良好的SWC会在调用Com_ReceiveSignalGroup前尝试读取组信号。
此外,在I-PDU层级也有PDU Group的概念,RTE或者SWC可以控制针对某些PDU Group的收发禁用,这在首帧NM报文实现上非常有用。
在下一节文章中我们将重点介绍信号及PDU的具体收发流程以及一些大家常见的问题及解答。